package com.example.small_compose;

import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.RemoteViews;

import java.util.Date;

public class WidgetDemoProvider extends AppWidgetProvider {

    private final static String TAG = "WidgetDemoProvider";
    /**
     * 当 Widget 第一次被添加时调用，例如用户添加了两个你的 Widget，那么只有在添加第一个 Widget 时该
     * 方法会被调用。所以该方法比较适合执行你所有 Widgets 只需进行一次的操作。对用广播的 Action 为
     * ACTION_APPWIDGET_ENABLE。
     */
    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.i(TAG,"onEnabled");
    }

    /**
     * 与 onEnabled 恰好相反，当你的最后一个 Widget 被删除时调用该方法，所以这里用来清理之前在 onEnabled() 中进行的操作。
     * 当最后一个该类型的小部件从桌面移除时调用，对应的广播的 Action 为 ACTION_APPWIDGET_DISABLED。
     *
     */
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.i(TAG,"ondisabled");
    }

    /**
     * 当 Widget 第一次被添加或者大小发生变化时调用该方法，可以在此控制 Widget 元素的显示和隐藏。
     * 当小部件布局发生更改的时候调用。对应广播的 Action 为 ACTION_APPWIDGET_OPTIONS_CHANGED。
     *
     * @param appWidgetManager 您可以调用 AppWidgetManager.updateAppWidget 的 AppWidgetManager 对象。
     * @param appWidgetId 大小改变的widget的appWidgetId。
     * @param newOptions
     */
    @Override
    public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
        super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
        Log.i(TAG,"onappwidgetoptionschanged");
    }

    /**
     * 当小部件从备份中还原，或者恢复设置的时候，会调用，实际用的比较少。对应广播的 Action 为 ACTION_APPWIDGET_RESTORED。
     * @param oldWidgetIds
     * @param newWidgetIds
     */
    @Override
    public void onRestored(Context context, int[] oldWidgetIds, int[] newWidgetIds) {
        super.onRestored(context, oldWidgetIds, newWidgetIds);
        Log.i(TAG,"onrestored");
    }

    /**
     * AppWidget 更新事件
     *
     * 小部件被添加时或者每次小部件更新时都会调用一次该方法，配置文件中配置小部件的更新周期 updatePeriodMillis，每次更新都会调用。对应广播 Action 为：ACTION_APPWIDGET_UPDATE 和 ACTION_APPWIDGET_RESTORED
     *
     * @param appWidgetManager 更新 AppWidget 状态； 获取有关已安装 AppWidget 提供程序和其他 AppWidget 相关状态的信息。
     * @param appWidgetIds 需要更新的 appWidgetIds。 请注意，这可能是此提供程序的所有 AppWidget 实例，也可能只是其中的一个子集。
     */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.i(TAG,"onupdate");
        for (int appWidgetId : appWidgetIds) {
            // 创建 RemoteViews 对象
            @SuppressLint("RemoteViewLayout")
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
//            Log.i(TAG,"onupdate");
            // 更新文本
            views.setTextViewText(R.id.widget_text, "Updated at: " + new Date());

            // 添加点击事件（示例：点击打开应用）
            Intent intent = new Intent(context, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);
            views.setOnClickPendingIntent(R.id.widget_text, pendingIntent);

            // 应用更新
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

    /**
     * 当 Widget 被删除时调用该方法。
     *
     * 每删除一个小部件就调用一次。对应的广播的 Action 为： ACTION_APPWIDGET_DELETED 。
     *
     * @param appWidgetIds 已从其组件集群中删除的 appWidgetIds。
     */
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        super.onDeleted(context, appWidgetIds);
        Log.i(TAG,"ondeleted");
    }

    /**
     *  接收广播的回调函数
     * onReceive() 中处理的是 Widget 相关的广播事件，然后分发到各个回调函数中onUpdate(), onDeleted(), onEnabled(), onDisabled, onAppWidgetOptionsChanged()。
     *
     * @param context
     * @param intent
     */
    @Override
    public void onReceive(Context context, Intent intent) {
//        String action = intent.getAction();
//        if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
//            this.onEnabled(context);
//        }
//        else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
//            this.onDisabled(context);
//        }
        Log.i(TAG,"onreceive");
        super.onReceive(context, intent);
    }
}

